/*数据互联*/
import React from "react";
import { Input } from "antd";
import set from "lodash/set";
import { useFormField } from "../../context/form-context";
import { useForm } from "../../context/metadata-context";
import DataConnect from "./DataConnect";/*数据互联组件*/
import { useInject } from "../../context/inject-context";
import { reloadField } from "../../context/metadata-context";//表单字段reload事件
import eventBus, { useSubscribe } from "../../eventBus";
import { parseToArray } from "../../utils";
import {replaceHref} from "./utility"//数据互联组件的公共方法
import { mergecalculateFormData } from "../../../../apis/mergeFormData";

let defaultConfig = {
  //这一批属性来源 tplData.form.data_control （步骤权限）
  // "code": "shujuhulian",
  // "name": "数据互联",
  // "type": "data_connect",
  // "is_show": true,
  // "is_editable": true,
  // "is_required": false,

  //这一批属性来源 tplData.form.form_meta_data （表单设计器）
  // "designProps": {
  //     "code": "shujuhulian",
  //     "name": "数据互联",
  //     "ui": "wfd_dataconnect",
  //     "title": "数据互联",
  //     "layout": "control_layout_leftRight",
  //     "defaultValue": "",
  //     "text": "请选择数据互联",
  //     "groupTitle": "",
  //     "byTableGroupTitle": false,
  //     "tipstext": "",
  //     "type": "data_connect",
  //     "title_w": 85
  // },
  // "isUsed": false,

  //这一批属性来源 tplData.form.data_define （业务对象）
  // "show_type": "",
  // "show_type_name": "",
  // "props": {
    // "source_type": "sql",//数据源类型，数据互联固定为sql
    // "configs": "SELECT* AS PayMoney",//数据源sql语句
    // "data_template": {
    //     "type": "list",
        // "query": "ContractCode",//数据互联的查询code，单选模式下，值必须唯一
        // "pageSize": "20",//每页展示数量
        // "sort": "ContractCode",//排序字段
        // "display": "ContractName",//显示文本字段
        // "href": "http://www.baidu.com",//PC选中后元素跳转链接
        // "mhref": "http://www.baidu.com",//移动选中后元素跳转链接
        // "column": [
        //     {
        //         "code": "ContractCode",
        //         "name": "合同编号",
        //         "type": "text",
        //         "format": "",
        //         "isShow": 1//table展示列是否展示 1显示 0不显示
        //     }
        // ]//数据互联table列信息
    // },//数据互联table配置
    // "list": [
    //     {
    //         "source_code": "ContractName",
    //         "source_type": "text",
    //         "target_code": "a1",
    //         "target_type": "text"
    //     }
    // ],//联动更新关系，source_code：当前列表字段，target_code：被联动更新的字段
    // "multiple": "1"//是否多选
  // },
  // "type_name": "数据互联",
  // "is_sys": 0,  
  // "isHide": false,
  // "default_value": "",
  
  //来源 tplData.form.defaultValueConf
  // "default": null
}

export default function ({ 
    id, 
    field, 
    label, 
    rules, 
    showLabel = false, 
    onChange, 
    onBlur, 
    displayFormatter, 
    valueFormatter, 
    required, 
    cell, 
    groupCode,
    isSubTableField,
    rowIndex,
    ...others }) {

  const injectInfo = useInject();
  if (injectInfo?.isDefaultRequired === true) {
    rules = [{
        validator(rule, value, callback) {
            if(value === '[]' || value === undefined || value === null || value === ""){//当前值为空数组时，触发校验
                return false;
            }
            return true;
        }
    }];//选人组件需要自定义必填校验
  }

  const { input: fieldConfig, property, validation, readonly, className, isDisplay} = useFormField({
    field,
    rules,
    onChange,
    displayFormatter,
    valueFormatter,
    triggerBlurAsChange: true,
    alwaysTriggerChangeEvt: true,
    onBlur,
  });
  const { data: tplData, urlPrefix, params, csrfToken } = useForm().root;
  let href = cell.props.data_template?.href || "";//数据互联配置的PC href属性
  
  useSubscribe(`field.change.${field}`, (data)=>{
    data = parseToArray(data);
    //触发其他字段联动更新
    distributeData({
      tplData: tplData,
      cell: cell, //当前字段信息
      data: data, //联动数据源
      rowIndex: rowIndex, //行索引
      groupCode: groupCode//字段所在分组code
    })//更新联动字段
    //底层组件返回的是数组类型，但是实际保存要转换为字符串
  })

  let defaultValue = fieldConfig.value;
  //defaultValue = '[{"name":"和平区","code":"210102"}, {"name":"和平区1","code":"2101021"} ,  {"name":"和平区3","code":"2101024"}]';//数据源是字符串的数值，可以用来做测试数据
  if(defaultValue === undefined || defaultValue === null || typeof(defaultValue) !== "string"){//字段值容错处理
    console.warn("字段 ‘" + cell.name + "’ 的值有误，重置为空数组，错误值：", defaultValue);
    if(Array.isArray(defaultValue)){//如果默认值是数组
      fieldConfig.onChange(JSON.stringify(defaultValue));
      return null;
    }else{//其他情况转为空数组（比如对象类型，会导致组件出错）,
      defaultValue = [];
      fieldConfig.onChange("[]");
      return null;
    }
  }else{
    defaultValue = parseToArray(defaultValue);//转为数组
  }
  let column = cell?.props?.data_template?.column;//当前组件配置的列信息
  //返回实际需要显示的文本
  function getDataText(value) {
    if(value.length <= 0){
      return null;
    }
    
    var displayField = cell.props.data_template.display;
    return value.map(function(item, key){
      let text = unescape(item[displayField]);
      if (href){//有超链接就返回a标签
        let url = replaceHref({
          url: href,
          itemData: item,
          host: tplData.ServerAddr,
          column: column
        });
        return <a href={url} key={key} target="_blank" className="inline-block mr-3 hover:underline">{text}</a>;
      }else{//没有就返回span
        return <span key={key} className="inline-block mr-3">{text}</span>;
      }
    })
  }

  //只读模式
  if (isDisplay) {
    return getDataText(defaultValue);
  }
  
  //编辑模式
  return <DataConnect
            fieldName={cell?.name}//字段中文name
            placeholder={cell?.designProps?.text}//表单设计器提示语
            className={className}//额外的class 比如校验失败
            value={defaultValue}//默认值
            column={column}//业务对象配置的列信息
            
            data_template={cell?.props?.data_template}//业务对象配置的数据格式

            queryCode={cell?.props?.data_template?.query}//业务对象配置的搜索字段code
            sortCode={cell?.props?.data_template?.sort}//业务对象配置的排序字段code
            textField={cell?.props?.data_template?.display}//业务对象配置的要显示为文本的字段
            pageSize={cell?.props?.data_template?.pageSize}//分页
            advancedQuery={cell?.props?.data_template?.advancedQuery}//高级搜索

            package_id={params.package_id}//package_id
            process_id={""}//流程id? params.proc_id
            fullCode={isSubTableField ? (groupCode + "." + cell.code) : cell.code }//主表：字段code 子表：分组code.字段code
            groupCode={groupCode}//字段所在分组code，注：子表取的是分组code  主表取的是主表code（不是主表分组code）
            isSubTableField={isSubTableField}//是否子表
            rowIndex={rowIndex}//如果子表，标记当前字段的行索引
            multiple={cell.props.multiple}//单选|多选
            tplData={tplData}
            onChange={(data)=>{
              fieldConfig.onChange(JSON.stringify(data));
            }}//字段数据变化事件
            href={href}//数据互联配置的超链接
          ></DataConnect>;
}

//数据互联联动更新其他字段
function distributeData({
  tplData,
  cell, //当前字段信息
  data, //联动数据源
  rowIndex, //行索引
  groupCode//字段所在分组code
}){
  if(cell?.props?.multiple == "1"){//如果数据互联配置的是多选，则不作联动操作
    return;
  }
  let list = cell.props.list;
  
  list.forEach(function(item){
    var source = item.source_code;//第三方接口字段
    var target = item.target_code.split(".");//表单字段，子表带 groupCode 区分主表和子表字段
    var fieldCode = target.length > 1 ? target[1] : target[0];//获得不带 groupCode 的表单字段

    //拼接eventbus消息字符串
    let fieldPath = "";
    if(rowIndex === undefined){//主表路径
      fieldPath = `form.form_data.main.${fieldCode}`;
    }else{//子表路径
      fieldPath = `form.form_data.children.${groupCode}[${rowIndex}].${fieldCode}`;
    }
    
    let fieldValue = data?.[0]?.[source] || "";
    eventBus.publish(reloadField, fieldPath, fieldValue);//发送消息更新对应字段值

    set(tplData, fieldPath, fieldValue);//手动更新tplDate的值，防止字段没有拖拽到表单上，导致没有更新tplDate

    if(rowIndex === undefined){//主表路径
      
    }else{//子表路径
      eventBus.publishAsync(`group.update.${groupCode}`);//子表在联动完毕之后，再更新一次table重绘，重置固定列高度（左侧固定列和右侧删除列）
    }

  });

  //tplData.calculateFormData = mergecalculateFormData(tplData);//数据互联联动结束后，更新一次前端计算数据源依赖

}